Play framework 1.2x + Scalaで配列やオブジェクトをPOSTする
Play-ScalaでPOST
このあたりをみればわかりますが、PlayframeworkではPOSTした値を簡単にバインディングできる仕組みをもっており、 コントローラーのメソッドの引数へフォームの値の受け渡しを簡単に行うことができます。 play-scalaでも同じようにバインディングは可能で、今回配列やオブジェクトへのバインディングをおこなったのでメモしておきます。
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Playframework : 1.2.1
- Play-Scala : 0.9.1
- Java : 1.6.0_31
プロジェクトの準備
play1.2をインストールし、パスをとおしておいてください。 そしてplay-scalaをインストールします。
$ play install scala
bindSampleという名前でScalaプロジェクトを作成します。
$ play new bindSample --with scala
配列へのバインド
パラメータとして、カンマ区切りでわたされた文字列を配列にバインドしてみます。 デフォルトで生成されたコントローラー、app/controllers/controllers.scalaを下記のように変更しましょう。
・・・ import play.data.binding.As object Application extends Controller { def arrayBind(@As(Array(",")) paramArray: Array[String]) = { paramArray.map(println) html.index("Your Scala application is ready!") } }
Asアノテーションを使用すると、パラメータの内容を解析し、引数で指定された文字で分割します。 各文字列は、Arrayに格納されます。
conf/routesファイルにパスを追加します。
GET /bindArray Application.arrayBind
play runでアプリケーションを起動し、ブラウザからカンマ区切りのパラメータを渡してアクセスしてみましょう。 コンソールでString配列の値が表示されます。
http://localhost:9000/?paramArray=1,2,3
オブジェクトへのバインド
オブジェクトのコレクションを一度に渡すことも可能です。 Applicationにメソッドを追加し、クラスを追加します。
・・・ object Application extends Controller { def objBind(objList: java.util.List[User]) = { println(objList) html.index("Your Scala application is ready!") } ・・・ } case class User(name:String,age:Int)
Userクラスをcontroller.scala内に定義し、objBindにはそのリストを渡します。 ScalaのListはバインドされないので、java.util.Listを明示的に指定しています。
conf/routesファイルにパスを追加します。
GET /obj Application.objBind
play runでアプリケーションを起動し、ブラウザからパラメータを渡してアクセスしてみましょう。 Userオブジェクトを2つ同時にパラメータで指定して渡してみます。 「引数の名前[インデックス].フィールド名=値」として指定すればパラメータを渡すことができます。
http://localhost:9000/obj?objList[0].name=taro&objList[0].age=20&objList[1].name=hanako&objList[1].age=25 //結果のコンソール [User(taro,20), User(hanako,25)]
オブジェクトのコレクションも簡単に渡すことができます。 JSを使用しても、上記のようにクエリパラメータを指定すればバインドさせることができます。